import 'dart:ui';

import 'package:get/get.dart';
import 'package:sinosheets/utils/bus_utils.dart';
import 'package:sinosheets/utils/storage/LSUtil.dart';

class LanguageUtil {
  /// 目前支持的语言代码列表
  static List<String> supportLanguageCodeList = [
    LanguageType.english.code,
    LanguageType.chinese.code,
  ];

  /// 判断是否中文
  static bool isChinese() {
    /// 根据语言设置返回不同的字段
    String languageCode = LSUtil.getLanguage();
    if (languageCode == LanguageType.chinese.code) {
      return true;
    } else {
      return false;
    }
  }

  /// 判断是否英文
  static bool isEnglish() {
    /// 根据语言设置返回不同的字段
    String languageCode = LSUtil.getLanguage();
    if (languageCode == LanguageType.english.code) {
      return true;
    } else {
      return false;
    }
  }

  /// 获取语言代码
  /// 1. 从缓存中取，老用户选择过语言，已经保存在本地缓存中
  /// 2. 取系统设置，并保存本地，就当默认选了
  /// 3. 默认为en
  static String getLanguageCode() {
    /// 取本地缓存，如果已经保存，并且支持，直接返回； 说明是老用户
    String languageCode = LSUtil.getLanguage();
    if (languageCode.isNotEmpty && supportLanguageCodeList.contains(languageCode)) {
      return languageCode;
    }

    /// 本地缓存没有，取系统设置，并且支持，返回系统设置；说明是新用户；
    /// 系统配置存本地，就当是默认选的
    languageCode = Get.deviceLocale?.languageCode ?? '';
    if (languageCode.isNotEmpty && supportLanguageCodeList.contains(languageCode)) {
      LSUtil.saveLanguage(languageCode);
      return languageCode;
    }

    /// 本地没有，系统设置不支持，返回默认的英语
    languageCode = 'en';
    return languageCode;
  }

  /// 语言列表(都没有选中)
  /// 名称固定，不需要执行多语言函数，直接静态变量
  static List languageList = [
    {
      'name': LanguageType.english.label,
      'code': LanguageType.english.code,
      'select': false,
      'flag': 'assets/flags/gb.png',
    },
    {
      'name': LanguageType.chinese.label,
      'code': LanguageType.chinese.code,
      'select': false,
      'flag': 'assets/flags/cn.png',
    },
  ];

  /// 带单选状态的语言列表
  static List getLanguageList() {
    /// 根据本地存储的状态设置选中状态
    String code = LSUtil.getLanguage();
    for (var item in languageList) {
      if (code == item["code"]) {
        if (supportLanguageCodeList.contains(code)) {
          item["select"] = true;
          Get.updateLocale(Locale(code));
        } else {
          item["select"] = false;
        }
      } else {
        item["select"] = false;
      }
    }
    return languageList;
  }

  /// 选中的语言选项
  static Map getSelectItem() {
    /// 根据本地存储的状态设置选中状态
    String code = LSUtil.getLanguage();
    Map selectItem = {};
    for (var item in languageList) {
      if (code == item["code"]) {
        if (supportLanguageCodeList.contains(code)) {
          selectItem = item;
          break;
        }
      }
    }
    return selectItem;
  }

  /// 切换语言
  static changeLanguage() {
    String code = LSUtil.getLanguage();
    if (supportLanguageCodeList.contains(code)) {
      Get.updateLocale(Locale(code));
      bus.emit('language_change');
    }
  }
}

enum LanguageType {
  english(code: "en", label: "English"),
  chinese(code: "zh", label: "简体中文");

  const LanguageType({required this.code, required this.label});

  final String code;
  final String label;

  static LanguageType parse(String? code) {
    /// 解析从后台传来的值
    if (code == "zh") {
      return LanguageType.chinese;
    }

    return LanguageType.english;
  }
}
